﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace 策略模式
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    /// 可以看到,如果我们增加了一个死亡的行为,所有继承Hero的类就都要实现death()函数, 这个很烦哎~后期每增加一个新的行为,
    /// 不管这个行为前面已经实现的英雄是否会用到(有些行为只有特定英雄能用到,比跳跃),都要重新实现这个新增的函数.这就有点头疼了啊

    ///    那么聪明的你可能会想到用接口啊 ~~
    ///
    ///     定义一个跳跃的接口 , 可以跳跃的英雄实现这个接口,不可以跳跃的英雄就不用实现不就好了
    ///
    ///     这的确实个好办法, 但是如果有很多种英雄都可以跳跃, 并且如果跳跃后期要改动的话, 
    /// 就要到每个具体实现跳跃的类当中一个一个的修改了, 这样无非没有很好的支持重用
    /// 那么有没有一种模式可以方便拓展新的行为, 又可以很好的重用呢?
    ///
    ///这个时候策略模式就闪亮登场了 ^ _ ^
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Hero hero1 = new Fashi();
            hero1.HeroName = "法师 1";

            Hero hero12 = new Fashi();
            hero12.HeroName = "法师 2";

            Hero hero2 = new Gongjianshou();
            hero2.HeroName = "弓箭手1";

            Hero hero3 = new Naima();
            hero3.HeroName = "奶妈1";

            Hero hero4 = new Juren();
            hero4.HeroName = "巨人1";

            var heroList = new List<Hero> {hero1, hero12, hero2, hero3, hero4};
            foreach (var t in heroList)
            {
//所有英雄直接执行相应动作 如果在英雄初始化注册了动作就会执行这个动作  
                var currentHero = t;
                currentHero.DisplayName();
                currentHero.OnMove();
                currentHero.OnAttack();
                currentHero.OnJiaxue();
            }
        }
    }
}
